Validation

PHP:7.2

Laravel:5.7

在實務上,所有傳進 Controller 的參數都應該是被限制的,這樣才不會造成資安或不可預期的錯誤。

除了傳統一個一個驗證之外,Laravel 也有提供許多關於 Validation 的用法。

Notice: 各型態規則的設定方式可以詳見官網。

Controller Validation

利用 Request 的 validate 方法進行驗證,如果失敗網頁會被導出。

範例

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    public function doc(Request $request)
    {
        // required 為必填
        $validatedData = $request->validate([
            'title' => 'required|max:255',
            'body' => 'required',
        ]);

        dd($validatedData);
    }
}
以下列幾個常用的規則讓大家參考:
Name
Description
required 驗證欄位一定要有值,不能為空
present 驗證欄位一定要有值,可以為空
filled 驗證欄位存在時,不能為空值
nullable 驗證欄位可以是 null

Validator Class

如果需要更細致一點的操作,可以使用 Validator Class

範例

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Validator;

class TestController extends Controller
{
    public function doc(Request $request)
    {
        // 第一個參數是欄位與值(可以直接代入 $request->all())
        // 第二個參數是 rules
        $validator = Validator::make([
                'name' => 'Johnson'
            ], [
                'name' => 'required|min:5'
            ]
        );

        // 驗證失敗
        if ($validator->fails()) {
            return response()->json([
                'message' => 'Parameters Error',
                'errors' => $validator->errors()
            ], 400);
        }
    }
}

Form Request Validation

如果是大量使用的認證規則,可以選擇建立一個 Request Rule

首先先透過 Artisan 建立一個 Request

php artisan make:request DocValidation

再去修改 Request 相關設定和規則:
app/Http/Requests/DocValidation.php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class DocValidation extends FormRequest
{
    public function authorize()
    {
        // 這裡可以做一些身份認證的事
        // 不需身份認證可以直接 return true
        return true;
    }

    public function rules()
    {
        return [
            'name' => 'required|min:5'
        ];
    }
}

Controller

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\DocValidation;

class TestController extends Controller
{
    public function doc(DocValidation $request)
    {
        // 如果失敗也會被導出
        $validatedData = $request->validated();
        dd($validatedData);
    }
}
Categories: Laravel